#include "yalb_abstracttreemodel.h"

// yALB_AbstractTreeItem

yALB_AbstractTreeItem::yALB_AbstractTreeItem(yALB_AbstractTreeItem *_parent) : parentItem(_parent){
    if(parentItem)
        parentItem->children.append(this);
}

yALB_AbstractTreeItem::~yALB_AbstractTreeItem() {
    for(int i = 0; i<children.size(); ++i) {
        children.at(i)->parentItem = NULL;
        delete children.at(i);
    }
    if(parentItem)
        parentItem->children.remove(parentItem->children.indexOf(this));
}

int yALB_AbstractTreeItem::childCount() const {
    return children.count();
}

int yALB_AbstractTreeItem::row() const {
    if(parentItem)
        return parentItem->children.indexOf(const_cast<yALB_AbstractTreeItem*>(this));
    return -1;
}

yALB_AbstractTreeItem* yALB_AbstractTreeItem::child(int index) const {
    return children.value(index, NULL);
}

yALB_AbstractTreeItem* yALB_AbstractTreeItem::parent() const {
    return parentItem;
}

void yALB_AbstractTreeItem::clearChildren() {
    for(int i = 0; i<children.size(); ++i) {
        children.at(i)->parentItem = NULL;
        delete children.at(i);
    }
    children.clear();
}

// yALB_AbstractTreeModel

yALB_AbstractTreeModel::yALB_AbstractTreeModel(yALB_AbstractTreeItem *_rootItem, QObject *parent) :
    rootItem(_rootItem), QAbstractItemModel(parent)
{
    Q_ASSERT(rootItem);
}

yALB_AbstractTreeModel::~yALB_AbstractTreeModel() {

}

Qt::ItemFlags yALB_AbstractTreeModel::flags(const QModelIndex &index) const {
    if (!index.isValid())
        return 0;

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}

int yALB_AbstractTreeModel::rowCount(const QModelIndex &parent) const {
    if(parent.isValid()) {
        yALB_AbstractTreeItem *parentItem = static_cast<yALB_AbstractTreeItem*>(parent.internalPointer());
        return parentItem->childCount();
    } else
        return rootItem->childCount();
}

QModelIndex yALB_AbstractTreeModel::index(int row, int column,
                  const QModelIndex &parent) const {
    if(!hasIndex(row, column, parent))
        return QModelIndex();

    yALB_AbstractTreeItem *parentItem;

    if(parent.isValid())
        parentItem = static_cast<yALB_AbstractTreeItem*>(parent.internalPointer());
    else
        parentItem = rootItem;
    return createIndex(row, column, parentItem->child(row));
}

QModelIndex yALB_AbstractTreeModel::index(yALB_AbstractTreeItem *item, int column) const {
    if(!item)
        return QModelIndex();

    int i = item->row();
    if(i < 0)
        return QModelIndex();
    return createIndex(i, column, item);
}

QModelIndex yALB_AbstractTreeModel::parent(const QModelIndex &index) const {
    if(!index.isValid())
        return QModelIndex();

    yALB_AbstractTreeItem *item = static_cast<yALB_AbstractTreeItem*>(index.internalPointer());
    yALB_AbstractTreeItem *parentItem = item->parent();

    if(parentItem == rootItem)
        return QModelIndex();

    return this->index(parentItem, 0);
}
